1 CABIN VERIFICATION AND VALIDATION - HABITAT DATA

Environment and Climate Change Canada

Analysis performed on 2018-02-28 13:32:39


This report presents the results of the verification and validation of a CABIN habitat data file associated to the project ****.

In this analysis, the habitat dataset is checked to answer the following question:

  • Do the habitat data reflect what were observed in the sites visited?

This document is a R notebook written in R Markdown. When you execute the code embedded in the notebook, the results will appear under the corresponding code. To do this, place your cursor inside a chunk (box which contains R code) and click the green arrow to the right of it named Run Current Chunk or press Ctrl+Shift+Enter (Cmd+Shift+Enter in macOS) on your keyboard. Repeat for each chunk. As the code contained in this notebook is executed, the results will appear under each of the corresponding chunks in this window. Once all commands are executed, click the Preview button at the top left of this window or press the Ctrl+Shift+K keys (Cmd+Shift+K in macOS). A new window will appear and will contain the report of these verification and validation results for the general CABIN data.

1.1 Requirements

This notebook assumes that you have imported your data into R using the import notebook (CABIN_vv_import.Rmd).

The dataset containing habitat data for this project is present.

1.2 Descriptive Statistics

The data file contains 458 visits (lines) and 89 variables (columns).

The following table presents a subset of the data.

Reading General Data

ACTION: Check the data and make sure it reflects reality. Consider the following:

  • Does the file seem to have been read correctly?
  • Are columns missing?

List of visits present in the habitat data (ID from the CABIN database):

17215, 17216, 17217, 18368, 18375, 18364, 18493, 18495, 18496, 18758, 18759, 18760, 18546, 18548, 18549, 19013, 19017, 19018, 16962, 16965, 16966, 17363, 17364, 17365, 18839, 18841, 18845, 17492, 17493, 17494, 21911, 21925, 21926, 18328, 18329, 18330, 19971, 20219, 18632, 20220, 18628, 18630, 18631, 17496, 17497, 17498, 18889, 18890, 18892, 20302, 21710, 20303, 20304, 18663, 18664, 18665, 16863, 18796, 18798, 18799, 19070, 19072, 19082, 18718, 18723, 18724, 17241, 17248, 17253, 18693, 18826, 19044, 26231, 16828, 17272, 17273, 17274, 18787, 18790, 18791, 17522, 17568, 17573, 17436, 17437, 17438, 18378, 18449, 18459, 24059, 17450, 17456, 17461, 18747, 18748, 18750, 19104, 18730, 18732, 18734, 16913, 16914, 16919, 18300, 18301, 18302, 18499, 18498, 18497, 16921, 16922, 16923, 18296, 18298, 18299, 16849, 16853, 16854, 17412, 17413, 17418, 18545, 18735, 18736, 18667, 18678, 18692, 18666, 18681, 18682, 17502, 17565, 17570, 18622, 18623, 18624, 18821, 18823, 18824, 19037, 19042, 19043, 18542, 18543, 18544, 18901, 18903, 18904, 21846, 21850, 21854, 19045, 19046, 19048, 18331, 18332, 18333, 19103, 19038, 19040, 19041, 19069, 19073, 19084, 16997, 18757, 18830, 18832, 18610, 18611, 18616, 17472, 17476, 17477, 19086, 19087, 19088, 18891, 18893, 18899, 18753, 18777, 18780, 17463, 17465, 17466, 18828, 18829, 18894, 18803, 18805, 18806, 17488, 17490, 17491, 17569, 17575, 17578, 18922, 18977, 18996, 18923, 18927, 18929, 18482, 18483, 18484, 19015, 19016, 19014, 16934, 16935, 16936, 28210, 28212, 28213, 29505, 29506, 29507, 19033, 19035, 19036, 19075, 19077, 19078, 18475, 18479, 18480, 18453, 18454, 18455, 19094, 19096, 19098, 16907, 16908, 16911, 18661, 18662, 18782, 18743, 18770, 18774, 18711, 18716, 18717, 16867, 16868, 16866, 18695, 18696, 18766, 18655, 18658, 18659, 18763, 18768, 18769, 18520, 18524, 18525, 17483, 17487, 17489, 18772, 18773, 18775, 16945, 16961, 16967, 18644, 18669, 18677, 16834, 16833, 16832, 18843, 18844, 18846, 18701, 18702, 18703, 18687, 18689, 18691, 18800, 18801, 18802, 18519, 18522, 18523, 18372, 18373, 18374, 18647, 18648, 18649, 18618, 18619, 18620, 18476, 18477, 18478, 19002, 19049, 19011, 28315, 28316, 28317, 18785, 18786, 18789, 21909, 26432, 19089, 19090, 19091, 16852, 16858, 16859, 17289, 17597, 17595, 18450, 18451, 18452, 18868, 18895, 18896, 19101, 16898, 16903, 16900, 16893, 16991, 16992, 18674, 18676, 18679, 20305, 20307, 20308, 18604, 18605, 18606, 18607, 18602, 18719, 18720, 18721, 19547, 19548, 18456, 18457, 18458, 18468, 18469, 18470, 18461, 18463, 18464, 19079, 19080, 19083, 18781, 18850, 18851, 18783, 18835, 18842, 18994, 19001, 19004, 18836, 18837, 18838, 18516, 18538, 18541, 19071, 19076, 19093, 16839, 16840, 16844, 17471, 17475, 17478, 19102, 16841, 16843, 16845, 17479, 17481, 17482, 16860, 16861, 16862, 18722, 18725, 18726, 17571, 17572, 17574, 21967, 21973, 21975, 19064, 19067, 19092, 17126, 17132, 17133, 18937, 18938, 18939, 18361, 18362, 18363, 19068, 19074, 19085, 16927, 16928, 16929, 16836, 16837, 16838, 18792, 18793, 18795, 16924, 16925, 16926, 17390, 17393, 17394, 16905, 16915, 16916, 18365, 18366, 18367, 18303, 18305, 18306, 26032, 26033, 26036, 18737, 18740, 18741, 21950, 21963, 21977, 18756, 18761, 18762

ACTION: *Check the data and make sure it reflects reality. Compare the list above with the following table which shows the visits from all the data for this project.

Site SampleDate SampleNumber
17215 AA06221 2008-09-30 1
17216 AA06222 2008-09-29 1
17217 AA06223 2008-09-28 1
18368 AA09211 2008-09-30 1
18375 AA09212 2008-09-29 1
18364 AA09213 2008-09-28 1
18493 AB02061 2008-09-30 1
18495 AB02062 2008-09-29 1
18496 AB02063 2008-09-28 1
18758 AB05291 2008-09-30 1
18759 AB05292 2008-09-29 1
18760 AB05293 2008-09-28 1
18546 AC09201 2008-09-30 1
18548 AC09202 2008-09-29 1
18549 AC09203 2008-09-28 1
19013 AG03041 2008-09-30 1
19017 AG03042 2008-09-29 1
19018 AG03043 2008-09-28 1
16962 AJ08031 2008-09-30 1
16965 AJ08032 2008-09-29 1
16966 AJ08033 2008-09-28 1
17363 AKN04261 2008-09-30 1
17364 AKN04262 2008-09-29 1
17365 AKN04263 2008-09-28 1
18839 AM05271 2008-09-30 1
18841 AM05272 2008-09-29 1
18845 AM05273 2008-09-28 1
17492 AMI05221 2008-09-30 1
17493 AMI05222 2008-09-29 1
17494 AMI05223 2008-09-28 1
21911 AP04131 2008-09-30 1
21925 AP04132 2008-09-29 1
21926 AP04133 2009-09-28 1
18328 AP04181 2008-09-30 1
18329 AP04182 2008-09-29 1
18330 AP04183 2008-09-28 1
19971 AR092808 2008-09-28 1
20219 AR092908 2008-09-29 1
18632 AR09292 2008-09-29 1
20220 AR093008 2008-09-30 1
18628 AS09051 2008-09-30 1
18630 AS09052 2008-09-29 1
18631 AS09053 2008-09-28 1
17496 AS09191 2008-09-30 1
17497 AS09192 2008-09-29 1
17498 AS09193 2008-09-28 1
18889 AT05101 2008-09-30 1
18890 AT05102 2008-09-29 1
18892 AT05103 2008-09-28 1
20302 BH12261 2008-09-30 1
20303 BH12262 2008-09-29 1
20304 BH12263 2008-09-28 1
18663 BL110801 2008-09-30 1
18664 BL110802 2008-09-29 1
18665 BL110803 2008-09-28 1
16863 BR06231 2008-09-30 1
18796 BS07281 2008-09-30 1
18798 BS07282 2008-09-29 1
18799 BS07283 2008-09-28 1
19070 BT11071 2008-09-30 1
19072 BT11072 2008-09-29 1
19082 BT11073 2008-09-28 1
18718 BW09191 2008-09-30 1
18723 BW09192 2008-09-29 1
18724 BW09193 2008-09-28 1
17241 BW10111 2008-09-30 1
17248 BW10112 2008-09-29 1
17253 BW10113 2008-09-28 1
18693 BY05231 2008-09-30 1
18826 BY05232 2008-09-29 1
19044 BY05233 2008-09-28 1
17272 CD01231 2008-09-30 1
17273 CD01232 2008-09-29 1
17274 CD01233 2008-09-28 1
18787 CD08121 2008-09-30 1
18790 CD08122 2008-09-29 1
18791 CD08123 2008-09-28 1
17522 CD10141 2008-09-29 1
17568 CD10142 2008-09-29 1
17573 CD10143 2008-09-28 1
17436 CD10161 2008-09-30 1
17437 CD10162 2008-09-29 1
17438 CD10163 2008-09-28 1
18378 CG03161 2008-09-30 1
18449 CG03162 2008-09-29 1
18459 CG03163 2008-09-28 1
24059 CG08121 2008-09-30 1
17450 CH04191 2008-09-30 1
17456 CH04192 2008-09-29 1
17461 CH04193 2008-09-28 1
18747 CJ9271 2008-09-30 1
18748 CJ9272 2008-09-29 1
18750 CJ9273 2008-09-28 1
18730 CM05221 2008-09-30 1
18732 CM05222 2008-09-29 1
18734 CM05223 2008-09-28 1
16913 CM10301 2008-09-30 1
16914 CM10302 2008-09-29 1
16919 CM10303 2008-09-28 1
18300 CMH04191 2008-09-30 1
18301 CMH04192 2008-09-29 1
18302 CMH04193 2008-09-28 1
18499 CN09021 2008-09-30 1
18498 CN09022 2008-09-29 1
18497 CN09023 2008-09-28 1
16921 CO04141 2008-09-30 1
16922 CO04142 2008-09-29 1
16923 CO04143 2008-09-28 1
18296 CS08311 2008-09-30 1
18298 CS08312 2008-09-29 1
18299 CS08313 2008-09-28 1
16849 CT11041 2008-09-30 1
16853 CT11042 2008-09-29 1
16854 CT11043 2008-09-28 1
17412 DE06091 2008-09-30 1
17413 DE06092 2008-09-29 1
17418 DE06093 2008-09-28 1
18545 DJ0906101 2008-09-30 1
18735 DJ09062 2008-09-29 1
18736 DJ09063 2008-09-28 1
18667 DM04041 2008-09-30 1
18678 Dm04042 2008-09-29 1
18692 DM04043 2008-09-28 1
18666 DR06151 2008-09-30 1
18681 DR06152 2008-09-29 1
18682 DR06153 2008-09-28 1
17502 DS06121 2008-09-30 1
17565 DS06122 2008-09-29 1
17570 DS06123 2008-09-28 1
18622 DT06091 2008-09-30 1
18623 DT06092 2008-09-29 1
18624 DT06093 2008-09-28 1
18821 DW01311 2008-09-30 1
18823 DW01312 2008-09-29 1
18824 DW01313 2008-09-28 1
19037 EE06181 2008-09-30 1
19042 EE06182 2008-09-29 1
19043 EE06183 2008-09-28 1
18542 EJ12211 2008-09-30 1
18543 EJ12212 2008-09-29 1
18544 EJ12213 2008-09-28 1
17443 EK07041 2008-09-30 1
17444 EK07042 2008-09-29 1
18901 ER07011 2008-09-30 1
18903 ER07012 2008-09-29 1
18904 ER07013 2008-09-28 1
21846 ES06091 2008-09-30 1
21850 ES06092 2008-09-29 1
21854 ES06093 2008-09-28 1
19045 ES11131 2008-09-30 1
19046 ES11132 2008-09-29 1
19048 ES11133 2008-09-28 1
18331 EW03271 2008-09-30 1
18332 EW03272 2008-09-29 1
18333 EW03273 2008-09-28 1
19038 GH03161 2008-09-30 1
19040 GH03162 2008-09-29 1
19041 GH03163 2008-09-28 1
19069 GL05231 2008-09-30 1
19073 GL05232 2008-09-29 1
19084 GL05233 2008-09-28 1
18757 HK09283 2008-09-30 1
18830 HK09292 2008-09-29 1
18832 HK09301 2008-09-30 1
18610 HM02271 2008-09-30 1
18611 HM02272 2008-09-29 1
18616 HM02273 2008-09-28 1
17472 JB09271 2008-09-30 1
17476 JB09272 2008-09-29 1
17477 JB09273 2008-09-28 1
19086 JB12071 2008-09-30 1
19087 JB12072 2008-09-29 1
19088 JB12073 2008-09-28 1
18891 JB12251 2008-09-30 1
18893 JB12252 2008-09-29 1
18899 JB12253 2008-09-28 1
18753 JC051401 2008-09-30 1
18777 JC051402 2008-09-29 1
18780 JC051403 2008-09-28 1
17463 JD03231 2008-09-30 1
17465 JD03232 2008-09-29 1
17466 JD03233 2008-09-28 1
18828 JD10191 2008-09-30 1
18829 JD10192 2008-09-29 1
18894 JD10193 2008-09-28 1
18803 JJ03271 2008-09-30 1
18805 JJ03272 2008-09-29 1
18806 JJ03273 2008-09-28 1
17488 JJ06301 2008-09-30 1
17490 JJ06302 2008-09-29 1
17491 JJ06303 2008-09-28 1
17569 JL02061 2008-09-30 1
17575 JL02062 2008-09-29 1
17578 JL02063 2008-09-28 1
18922 JL09091 2008-09-30 1
18977 JL09092 2008-09-29 1
18996 JL09093 2008-09-28 1
18923 JM04621 2008-09-30 1
18927 JM04622 2008-09-29 1
18929 JM04623 2008-09-28 1
18482 JM11131 2008-09-30 1
18483 JM11132 2008-09-29 1
18484 JM11133 2008-09-28 1
19015 JP03271 2008-09-30 1
19016 JP03272 2008-09-29 1
19014 JP03273 2008-09-28 1
16934 JR02121 2008-09-30 1
16935 JR02122 2008-09-29 1
16936 JR02123 2008-09-28 1
28210 JR03271 2008-09-30 1
28212 JR03272 2008-09-29 1
28213 JR03273 2008-09-28 1
29505 JR12091 2008-09-30 1
29506 JR12092 2008-09-29 1
29507 JR12093 2008-09-28 1
19033 JR12211 2008-09-30 1
19035 JR12212 2008-09-29 1
19036 JR12213 2008-09-28 1
19075 JS10011 2008-09-30 1
19077 JS10012 2008-09-29 1
19078 JS10013 2008-09-28 1
18475 JS11111 2008-09-30 1
18479 JS11112 2008-09-29 1
18480 JS11113 2008-09-28 1
18453 JT05241 2008-09-30 1
18454 JT05242 2008-09-29 1
18455 JT05243 2008-09-28 1
19094 JT09091 2008-09-30 1
19096 JT09092 2008-09-29 1
19098 JT09093 2008-09-28 1
16907 KC10081 2008-09-30 1
16908 KC10082 2008-09-29 1
16911 KC10083 2008-09-28 1
18661 KC12141 2008-09-30 1
18662 KC12142 2008-09-29 1
18782 KC12143 2008-09-28 1
18743 KF06181 2008-09-30 1
18770 KF06182 2008-09-29 1
18774 KF06183 2008-09-28 1
18711 KK01041 2008-09-30 1
18716 KK01042 2008-09-29 1
18717 KK01043 2008-09-28 1
16867 KL08312 2008-09-29 1
16868 KL08313 2008-09-28 1
16866 KL09301 2008-09-30 1
18695 KM01051 2008-09-30 1
18696 KM01052 2008-09-29 1
18766 KM01053 2008-09-28 1
18655 KM03021 2008-09-30 1
18658 KM03022 2011-09-29 1
18659 KM03023 2008-09-28 1
18763 km07061 2008-09-30 1
18768 km07062 2008-09-29 1
18769 km07063 2008-09-28 1
18520 KM07121 2008-09-30 1
18524 KM07122 2008-09-29 1
18525 KM07123 2008-09-28 1
17483 KM1221 2008-09-30 1
17487 KM1222 2008-09-29 1
17489 KM1223 2008-09-28 1
18772 KP03021 2008-09-30 1
18773 KP03022 2008-09-29 1
18775 KP03023 2008-09-28 1
16945 KR04191 2008-09-30 1
16961 KR04192 2008-09-29 1
16967 KR04193 2008-09-28 1
18644 KR09021 2008-09-30 1
18669 KR09022 2008-09-29 1
18677 KR09023 2008-09-28 1
16834 KV12191 2008-09-30 1
18310 KV12191 2010-09-15 1
16833 KV12192 2008-09-29 1
16832 KV12193 2008-09-28 1
18843 kw01011 2008-09-30 1
18844 kw01012 2008-09-29 1
18846 kw01013 2008-09-28 1
18701 LC03051 2008-09-30 1
18702 LC03052 2008-09-29 1
18703 LC03053 2008-09-28 1
18687 LC10141 2008-09-30 1
18689 LC10142 2008-09-29 1
18691 LC10143 2008-09-28 1
18800 LL10171 2008-09-30 1
18801 LL10172 2008-09-29 1
18802 LL10173 2008-09-28 1
18519 LN03171 2008-09-30 1
18522 LN03172 2008-09-29 1
18523 LN03173 2008-09-28 1
18372 LP06091 2008-09-30 1
18373 LP06092 2008-09-29 1
18374 LP06093 2008-09-28 1
18647 LR01081 2008-09-30 1
18648 LR01082 2008-09-29 1
18649 LR01083 2008-09-28 1
18618 ls05031 2008-09-30 1
18619 ls05032 2008-09-29 1
18620 ls05033 2008-09-28 1
18476 LS10231 2008-09-30 1
18477 LS10232 2008-09-29 1
18478 LS10233 2008-09-28 1
19002 ma08051 2008-09-30 1
19049 ma08052 2008-09-29 1
19011 ma08053 2008-09-28 1
28315 MC12281 2008-09-30 1
28316 MC12282 2008-09-29 1
28317 MC12283 2008-09-28 1
18785 ME08161 2008-09-30 1
18786 ME08162 2008-09-29 1
18789 ME08163 2008-09-28 1
21909 MG09031 2012-12-12 1
19089 MG12281 2008-09-30 1
19090 MG12282 2008-09-29 1
19091 MG12283 2008-09-28 1
16852 MH02261 2008-09-30 1
16858 MH02262 2008-09-29 1
16859 MH02263 2008-09-28 1
17591 MH06142 2008-09-29 1
17597 MH06143 2008-09-28 1
18450 MJ06091 2008-09-30 1
18451 MJ06092 2008-09-29 1
18452 MJ06093 2008-09-28 1
18868 MJ09251 2008-09-30 1
18895 MJ09252 2008-09-29 1
18896 MJ09253 2008-09-28 1
19101 ML04041 2008-09-30 1
16898 ML05021 2008-09-30 1
16903 ML05022 2008-09-29 1
16900 ML05023 2008-09-28 1
16893 ml12221 2008-09-30 1
16991 ml12222 2008-09-29 1
16992 ml12223 2008-09-28 1
18674 MM08081 2008-09-30 1
18676 MM08082 2008-09-29 1
18679 MM08083 2008-09-28 1
20305 MR08101 2008-09-30 1
20307 MR08102 2008-09-29 1
20308 MR08103 2008-09-28 1
18719 MW07101 2008-09-30 1
18720 MW07102 2008-09-29 1
18721 MW07103 2008-09-28 1
19547 MWLMCExp 2011-09-14 1
19548 MWLWCRef 2011-09-11 1
18456 NB10251 2008-09-30 1
18457 NB10252 2008-09-29 1
18458 NB10253 2008-09-28 1
18468 NG04251 2008-09-30 1
18469 NG04252 2008-09-29 1
18470 NG04253 2008-09-28 1
18461 NM10231 2008-09-30 1
18463 NM10232 2008-09-29 1
18464 NM10233 2008-09-28 1
19079 NP03311 2008-09-30 1
19080 NP03312 2008-09-29 1
19083 NP03313 2008-09-28 1
18781 NY01031 2008-09-30 1
18850 NY01032 2008-09-29 1
18851 NY01033 2008-09-28 1
18783 PC09211 2008-09-30 1
18835 PC09212 2008-09-29 1
18842 PC09213 2008-09-28 1
18994 PD03181 2008-09-30 1
19001 PD03182 2008-09-29 1
19004 PD03183 2008-09-28 1
18836 PE05051 2008-09-30 1
18837 PE05052 2008-09-29 1
18838 PE05053 2008-09-28 1
18516 PJ05151 2008-09-30 1
18538 PJ05152 2008-09-29 1
18541 PJ05153 2008-09-28 1
19071 PM02041 2008-09-30 1
19076 PM02042 2008-09-29 1
19093 PM02043 2008-09-28 1
16839 ps11141 2008-09-30 1
16840 ps11142 2008-09-29 1
16844 ps11143 2008-09-28 1
17471 PV02041 2008-09-30 1
17475 PV02042 2008-09-29 1
17478 PV02043 2008-09-28 1
16841 RB03091 2008-09-30 1
16843 RB03092 2008-09-29 1
16845 RB03093 2008-09-28 1
17479 RC06231 2008-09-30 1
17481 RC06232 2008-09-29 1
17482 RC06233 2008-09-28 1
16860 RG09061 2008-09-30 1
16861 RG09062 2008-09-29 1
16862 RG09063 2008-09-28 1
18722 RK06241 2008-09-30 1
18725 RK06242 2008-09-29 1
18726 RK06243 2008-09-28 1
17571 RR06231 2008-09-30 1
17572 RR06232 2008-09-29 1
17574 RR06233 2008-09-28 1
21967 RR10111 2008-09-30 1
21973 RR10112 2008-09-29 1
21975 RR10113 2008-09-28 1
19064 SAD01171 2008-09-30 1
19067 SAD01172 2008-09-29 1
19092 SAD01173 2008-09-28 1
17126 sb03291 2008-09-30 1
17132 sb03292 2008-09-29 1
17133 sb03293 2008-09-28 1
18937 SG11141 2008-09-30 1
18938 SG11142 2008-09-29 1
18939 SG11143 2008-09-28 1
18807 Site2 2011-01-01 1
18361 SJ10311 2008-09-30 1
18362 SJ10312 2008-09-29 1
18363 SJ10313 2008-09-28 1
19068 SM03261 2011-09-30 1
19074 SM03262 2008-09-29 1
19085 SM03263 2008-09-28 1
16927 SNE06041 2008-09-30 1
16928 SNE06042 2008-09-29 1
16929 SNE06043 2008-09-28 1
16836 SP12241 2008-09-30 1
16837 SP12242 2008-09-29 1
16838 SP12243 2008-09-28 1
18792 SR07151 2008-09-30 1
18793 SR07152 2008-09-29 1
18795 SR07153 2008-09-28 1
16924 SS05301 2008-09-30 1
16925 SS05302 2008-09-29 1
16926 SS05303 2008-09-28 1
17390 SS11171 2008-09-30 1
17393 SS11172 2008-09-29 1
17394 SS11173 2008-09-28 1
16905 TD10171 2008-09-30 1
16915 TD10172 2008-09-29 1
16916 TD10173 2008-09-28 1
18365 TH10061 2008-09-28 1
18366 TH10062 2008-09-29 1
18367 TH10063 2008-09-28 1
18303 TL04171 2008-09-30 1
18305 TL04172 2008-09-29 1
18306 TL04173 2008-09-28 1
26032 TP102801 2008-09-30 1
26033 TP102802 2008-09-29 1
26036 TP102803 2008-09-28 1
18737 VA03271 2008-09-30 1
18740 VA03272 2008-09-29 1
18741 VA03273 2008-09-28 1
21950 VE03051 2008-09-30 1
21963 VE03052 2008-09-29 1
21977 VE03053 2008-09-28 1
18756 ZD03171 2008-09-30 1
18761 ZD03172 2008-09-29 1
18762 ZD03173 2008-09-28 1
21710 bh12261 2008-09-30 1
26231 BY09291 2008-09-30 1
16828 CC05191 2008-09-30 1
19104 CLD01 2008-09-30 1
19103 FRS01 2008-09-29 1
16997 GL09301 2008-09-30 1
26432 MG09032 2012-12-09 1
17289 MH06141 2008-09-30 1
18604 Muskwa 406 2011-08-05 1
18605 Muskwa 423 2011-08-05 1
18606 Muskwa 424 2011-08-05 1
18607 Muskwa 425 2011-08-05 1
18602 Muskwa1 2011-08-04 1
19102 QNS-01 2008-09-28 1

Variables List:

Altitude, StreamOrder, DistanceFromSource, CH.Depth.Avg..cm., CH.Depth.BankfullMinusWetted..cm., CH.Depth.Max..cm., CH.Discharge..m.3.s., CH.Macrophyte..PercentRange., CH.Reach..CanopyCoverage..PercentRange., CH.Reach..Logging..PercentRange., CH.Reach.DomStreamsideVeg..Category..1.4.., CH.Reach.Pools..Binary., CH.Reach.Rapids..Binary., CH.Reach.Riffles..Binary., CH.Reach.StraightRun..Binary., CH.Slope..m.m., CH.Veg.Coniferous..Binary., CH.Veg.Deciduous..Binary., CH.Veg.GrassesFerns..Binary., CH.Veg.Shrubs..Binary., CH.Velocity.Avg..m.s., CH.Velocity.Max..m.s., CH.Width.Bankfull..m., CH.Width.Wetted..m., CH.XSEC.VelEquationSlope..m.3.rev., CH.XSEC.VelInstrumentDirect..Category..1.3.., CH.XSEC.VelMethod..Category..1.3.., CH.XSEC.VeloEquationIntercept..m.3.s., CL.Rainfall01_JAN..mm., CL.Rainfall06_JUN..mm., CL.Snowfall06_JUN..mm., CL.SnowfallTotal_ANNUAL..mm., CL.Temp01_JANMax..Degrees.Celsius., HY..Lake…., HY.Drainage.Area..km.2., HY.StreamDensity..m.km.2., LC.Reg.Alpine…., LC.Reg.Forest…., LC.Reg.Lake…., LC.Reg.UnregenForest…., LC.Reg.Wetland…., SD.Al..ppm., SD.As..ppm., SD.B..ppm., SD.Mg..ppm., SD.Ni..ppm., SU..Bedrock…., SU..Boulder…., SU..Cobble…., SU..Gravel…., SU..Pebble…., SU..Sand…., SU..Silt.Clay…., SU.D50..cm., SU.Dg..cm., SU.Dominant.1st..Category.0.9.., SU.Dominant.2nd..Category.0.9.., SU.Embeddedness..Category.1.5.., SU.PeriphytonCoverage..Category.1.5.., SU.SurroundingMaterial..Category.0.9.., TO.SlopeAvg…., WT.Ag..mg.L., WT.Al..mg.L., WT.Ba..mg.L., WT.CO3..mg.L., WT.General.Alkalinity..mg.L., WT.General.CarbonDOC..mg.L., WT.General.Colour..Unknown., WT.General.Conductivity..µS.cm., WT.General.DO..mg.L., WT.General.pH..pH., WT.General.SolidsTDS..mg.L., WT.General.SolidsTSS..mg.L., WT.General.SpCond..µS.cm., WT.General.TempAir..Degrees.Celsius., WT.General.TempWater..Degrees.Celsius., WT.General.Turbidity..NTU., WT.Ni..mg.L., WT.Nitrogen.NH3..mg.L., WT.Nitrogen.NO2..mg.L., WT.Nitrogen.NO2.NO3..mg.L., WT.Nitrogen.NO3..mg.L., WT.Nitrogen.TDN..mg.L., WT.Nitrogen.TN..mg.L., WT.Nitrogen.TN_Organic..mg.L., WT.Phosphorus.OrthoP..mg.L., WT.Phosphorus.TDP..mg.L., WT.Phosphorus.TP..mg.L., WT.S..mg.L.

ACTION: *Check the variables above and make sure they are all present.

1.2.1 General Statistics

The following table shows the main general parameters per variable. When the result on the BinaryData line of the array is TRUE, this indicates that the variable has binary data. However, this result can also be obtained because the variable has only one to two values at most. The Na.values line indicates the number of missing values for each variable.

Table of General Statistics

number of rows of result is not a multiple of vector length (arg 2)

ACTION: *Check the data and make sure it reflects reality. Examine statistics and identify, if present, anomalies with statistics.

1.3 Location of Habitat Data

1.3.1 Geographical Distribution of Habitat Variables

The following graphs show the location (latitude and longitude) and the observed value for variables saved in the habitat data file.

1.3.2 Map of Altitude

The following interactive map shows La carte interactive suivante illustre la position des sites en fonction des coordonnées géographiques contenues dans le fichier de données ainsi que l’altitude par site. Cliquez sur le marqueur d’une visite pour indiquer l’altitude observée dans celle-ci.

1.4 Presence of Outliers

1.4.1 Dispersion of Observed Values

The following scatterplots present the value of the continuous variable data observed in the dataset. Below the x-axis is the visit identifier for the corresponding observed value, namely the name of the site from which the data originated, its sampling date and the sampling number.

ACTION: Check the data and make sure it reflects reality. Consider the following:

  • Do data seem out of the ordinary?

1.4.2 Frequency Distribution

The following tables show the list of values observed by variable and their frequency within the habitat data file. These tables make it possible in particular to verify and validate the uniformity of the value naming for categorical variables observed in the data file. If the same value is listed twice in the same frequency table, it is possible that one of these values was written with one or more spaces before or after the word, which could explain the difference in the spelling of values that was detected by the software.

ACTION: For each of the following variables, check the data and make sure it reflects reality. Consider the following:

  • Is naming consistent?
  • Are frequencies consistent with reality?

1.5 Presence of Outliers

1.5.1 Dispersion of Observed Values

The following scatterplots present the value of the continuous variable data observed in the dataset. Below the x-axis is the visit identifier for the corresponding observed value, namely the name of the site from which the data originated, its sampling date and the sampling number.

ACTION: Check the data and make sure it reflects reality. Consider the following:

  • Do data seem out of the ordinary?

1.5.2 Boxplots of Observed and Transformed Values

The first boxplot (left) shows the distribution of continuous variable values observed in the data file, and the second box plot (right) shows the distribution of the logarithmic-transformed values.

ACTION: Check the data and make sure it reflects reality. Consider the following:

  • Do data seem out of the ordinary?

1.5.3 Identification of Potential Outliers

For each variable, the first boxplot (left) shows the distribution of continuous variable values observed in the dataset and the dispersion diagram (right) show the distribution of observed continuous variable values in the order in which they appear in this file. Data with identification by their identifier on the diagrams are potentially outliers contained in the dataset. The method used to identify potentially outliers is the interquantile range (IQR). The IQR is calculated as follows:

IQR(x) = quantile(x, 3/4) - quantile(x, 1/4)

Potential outliers are defined as values below Q1 - 1,5 IQR or above Q3 + 1,5 IQR.

The identifier of the visit corresponds to the name of the site from which the data originated, its sampling date and the sample number for this visit.

ACTION: Check the following graphs and put your attention on the points with a label (if present). Consider the following:

  • Are potential outliers truly aberrant?

The following list shows another way of identifying potential outliers contained in the data file for each variable. When the identifier of a data item is indicated therein, this indicates that this data represents potentially aberrant data contained in the data file. “” indicates non-aberrant data and NA indicates missing values. The identifier of the visit corresponds to the name of the site from which the data originated, its sampling date and the sampling number.

1.6 Data Normality

1.6.1 Quantile-Quantile Diagrams and Frequency Histograms

For each variable, the first graph (left) shows the observed distribution of variable values​by points and the theoretical normal distribution calculated from the parameters of the distribution observed by a straight line. The more the observed values are positioned along the line, the more they are distributed according to the normality.

The second graph (middle) illustrates a frequency histogram of the observed values​taxon. This histogram also shows the average value per variable by a solid line and the standard deviation of the two variables by dotted lines.

The third graph (right) illustrates the frequency distribution of the observed values per variable that are log-transformed. If the distribution of the data on this graph seems to be more like a normal distribution, a logarithmic transformation of the data might be useful. This histogram also illustrates the average value per variable by a solid line as well as the standard deviation of the variables by two dashed lines.

1.6.2 Boxplots of Observed Values

For each variable, the first boxplot (left) shows the distribution of observed values in the data file whereas the second boxplot (right) shows the distribution of observed values in the data file that has undergone logarithmic transformation.

1.6.3 Normality Tests

Les résultats suivants présentent le résultat obtenu par un test de Snows appliqué sur chaque variable du fichier de données. Une valeur de P (p-value) inférieure à 0.05 indique qu’il n’est pas possible de supposer que la distribution des données suit la loi normale avec une probabilité de 95%.

1.7 Collinearity of Variables

1.7.1 Scatterplot Matrix

The following scatterplot matrix illustrates the relationship between pairs of variables. It helps to detect the presence of correlations between variables.

1.7.2 Temporal Independence of Variables

For each variable, the first graph (top left) shows the observed value of the data according to their sampling year. The second graph (top right) illustrates the observed trends in changes in data values over time. The third graph (bottom left) shows future forecasts of changes in values over time. On this graph, the blue line corresponds to the expected average trend of changes over time, the dark gray zone corresponds to a confidence interval of 80% and the pale gray zone corresponds to a 95% confidence interval. The fourth graph (bottom right) illustrates time series autocorrelation (ACF). An autocorrelation value greater than the 95% confidence interval illustrated by the dotted line indicates a possible dependency between the variable and the time of year (time). For example, a certain value of a variable observed in a given year could be explained by a certain event from a previous year (lag in time in years). It should be noted that the autocorrelation at offset time 0 is, by definition, equal to 1.

Beware that variables with a lot of missing values can interrupt this procedure.

Below are the results of the Ljung-Box statistics test applied to each variable which confirming the results illustrated by the above graphs. A value of P (p-value) less than 0.05 makes it possible to assume that the residual values of a variable depend on the period of the year (time).

1.8 Releases Notes

What’s New, Updated, or Fixed in This Release


ACTION: New      ACTION: Updated      ACTION: Fixed


CABIN_vv_habitat.Rmd Version 1.1 — November 1st, 2017

Added suggestions of actions to help in the verification and validation of habitat data.

ACTION: Actions — Added suggestions of actions to help in the verification and validation of habitat data.

CABIN_vv_habitat.Rmd Version 1.0 — August 18, 2017

ACTION: First completed version.


Developed by Martin Jean and Evelyne Paquette-Boisclair

LS0tDQpkYXRlOiAnMjAxNy0xMS0wMScNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQp2ZXJzaW9uOiAnMS4xJw0KLS0tDQoNCnwgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vZ2NfZW4ucG5nKSAgfCAgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vY2FiaW5fbG9nby5wbmcpIHwNCnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiNDQUJJTiBWRVJJRklDQVRJT04gQU5EIFZBTElEQVRJT04gLSBIQUJJVEFUIERBVEENCg0KKkVudmlyb25tZW50IGFuZCBDbGltYXRlIENoYW5nZSBDYW5hZGEqDQoNCipBbmFseXNpcyBwZXJmb3JtZWQgb24gYHIgU3lzLnRpbWUoKWAqDQoNCioqKg0KDQpUaGlzIHJlcG9ydCBwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIGEgQ0FCSU4gaGFiaXRhdCBkYXRhIGZpbGUgYXNzb2NpYXRlZCB0byB0aGUgcHJvamVjdCAqKmByICNwYXN0ZShkYXRhc2V0TmFtZSlgKiouDQoNCkluIHRoaXMgYW5hbHlzaXMsIHRoZSBoYWJpdGF0IGRhdGFzZXQgaXMgY2hlY2tlZCB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbjoNCiAgDQogICsgRG8gdGhlIGhhYml0YXQgZGF0YSByZWZsZWN0IHdoYXQgd2VyZSBvYnNlcnZlZCBpbiB0aGUgc2l0ZXMgdmlzaXRlZD8NCg0KVGhpcyBkb2N1bWVudCBpcyBhIFIgbm90ZWJvb2sgd3JpdHRlbiBpbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkuIFdoZW4geW91IGV4ZWN1dGUgdGhlIGNvZGUgZW1iZWRkZWQgaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyB3aWxsIGFwcGVhciB1bmRlciB0aGUgY29ycmVzcG9uZGluZyBjb2RlLiBUbyBkbyB0aGlzLCBwbGFjZSB5b3VyIGN1cnNvciBpbnNpZGUgYSBjaHVuayAoYm94IHdoaWNoIGNvbnRhaW5zICpSKiBjb2RlKSBhbmQgY2xpY2sgdGhlIGdyZWVuIGFycm93IHRvIHRoZSByaWdodCBvZiBpdCBuYW1lZCAqUnVuIEN1cnJlbnQgQ2h1bmsqIG9yIHByZXNzICpDdHJsK1NoaWZ0K0VudGVyKiAoKkNtZCtTaGlmdCtFbnRlciogaW4gKm1hY09TKikgb24geW91ciBrZXlib2FyZC4gUmVwZWF0IGZvciBlYWNoIGNodW5rLiBBcyB0aGUgY29kZSBjb250YWluZWQgaW4gdGhpcyBub3RlYm9vayBpcyBleGVjdXRlZCwgdGhlIHJlc3VsdHMgd2lsbCBhcHBlYXIgdW5kZXIgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHVua3MgaW4gdGhpcyB3aW5kb3cuIE9uY2UgYWxsIGNvbW1hbmRzIGFyZSBleGVjdXRlZCwgY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gYXQgdGhlIHRvcCBsZWZ0IG9mIHRoaXMgd2luZG93IG9yIHByZXNzIHRoZSAqQ3RybCtTaGlmdCtLKiBrZXlzICgqQ21kK1NoaWZ0K0sqIGluICptYWNPUyopLiBBIG5ldyB3aW5kb3cgd2lsbCBhcHBlYXIgYW5kIHdpbGwgY29udGFpbiB0aGUgcmVwb3J0IG9mIHRoZXNlIHZlcmlmaWNhdGlvbiBhbmQgdmFsaWRhdGlvbiByZXN1bHRzIGZvciB0aGUgZ2VuZXJhbCBDQUJJTiBkYXRhLg0KDQoNCiMjUmVxdWlyZW1lbnRzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyBSZXF1aXJlZCBQYWNrYWdlcyBhbmQgQ3VzdG9tIEZ1bmN0aW9ucw0Kc291cmNlKCIuLi8uLi8uLi9SZXF1aXJlZF9wYWNrYWdlcy5SIikNCnNvdXJjZSgiLi4vLi4vLi4vUmVxdWlyZWRfZnVuY3Rpb25zLlIiKQ0KDQoNCiMjIFByb2plY3QgUHJlZmVyZW5jZXMNCnNvdXJjZSgiLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9wcm9qZWN0X3NldHRpbmdzLlIiKQ0KDQpgYGANClRoaXMgbm90ZWJvb2sgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGltcG9ydGVkIHlvdXIgZGF0YSBpbnRvICpSKiB1c2luZyB0aGUgaW1wb3J0IG5vdGVib29rIChDQUJJTl92dl9pbXBvcnQuUm1kKS4NCg0KVGhlIGRhdGFzZXQgY29udGFpbmluZyBoYWJpdGF0IGRhdGEgZm9yIHRoaXMgcHJvamVjdCBpcyAqKmByIGlmKGlzLmRhdGEuZnJhbWUoZGF0YXNldC5FTlYpKSAicHJlc2VudCIgZWxzZSAiYWJzZW50LiBQbGVhc2Ugb3BlbiBhbmQgZXhlY3V0ZSB0aGUgJ0NBQklOX3Z2X2ltcG9ydC5SbWQnIG5vdGVib29rIGJlZm9yZSB1c2luZyB0aGlzIG5vdGVib29rImAqKi4NCg0KIyNEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQoNClRoZSBkYXRhIGZpbGUgY29udGFpbnMgYHIge25yb3coZGF0YXNldC5FTlYpfWAgdmlzaXRzIChsaW5lcykgYW5kIGByIHtuY29sKGRhdGFzZXQuRU5WKX1gIHZhcmlhYmxlcyAoY29sdW1ucykuDQoNClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgYSBzdWJzZXQgb2YgdGhlIGRhdGEuDQoNCioqUmVhZGluZyBHZW5lcmFsIERhdGEqKiAgDQoNCmByIGhlYWQoZGF0YXNldC5FTlYpIGANCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKkNoZWNrIHRoZSBkYXRhIGFuZCBtYWtlIHN1cmUgaXQgcmVmbGVjdHMgcmVhbGl0eS4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZzoqDQo+DQo+IC0gKkRvZXMgdGhlIGZpbGUgc2VlbSB0byBoYXZlIGJlZW4gcmVhZCBjb3JyZWN0bHk/Kg0KPiAtICpBcmUgY29sdW1ucyBtaXNzaW5nPyoNCg0KDQoqKkxpc3Qgb2YgdmlzaXRzIHByZXNlbnQgaW4gdGhlIGhhYml0YXQgZGF0YSAoSUQgZnJvbSB0aGUgQ0FCSU4gZGF0YWJhc2UpOioqICANCg0KYHIgcm93bmFtZXMoZGF0YXNldC5FTlYpIGANCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKkNoZWNrIHRoZSBkYXRhIGFuZCBtYWtlIHN1cmUgaXQgcmVmbGVjdHMgcmVhbGl0eS4gQ29tcGFyZSB0aGUgbGlzdCBhYm92ZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGFibGUgd2hpY2ggc2hvd3MgdGhlIHZpc2l0cyBmcm9tIGFsbCB0aGUgZGF0YSBmb3IgdGhpcyBwcm9qZWN0Lg0KDQoNCmByIGZvcm1hdHRhYmxlKGRhdGFzZXQuTkFNLCBhbGlnbiA9ICJjIiwgcm93Lm5hbWVzID0gVFJVRSlgDQoNCg0KKipWYXJpYWJsZXMgTGlzdDoqKiAgDQoNCmByIGNvbG5hbWVzKGRhdGFzZXQuRU5WKSBgDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpDaGVjayB0aGUgdmFyaWFibGVzIGFib3ZlIGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgYWxsIHByZXNlbnQuDQoNCg0KIyMjR2VuZXJhbCBTdGF0aXN0aWNzDQoNClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIG1haW4gZ2VuZXJhbCBwYXJhbWV0ZXJzIHBlciB2YXJpYWJsZS4gV2hlbiB0aGUgcmVzdWx0IG9uIHRoZSAqQmluYXJ5RGF0YSogbGluZSBvZiB0aGUgYXJyYXkgaXMgKlRSVUUqLCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZSBoYXMgYmluYXJ5IGRhdGEuIEhvd2V2ZXIsIHRoaXMgcmVzdWx0IGNhbiBhbHNvIGJlIG9idGFpbmVkIGJlY2F1c2UgdGhlIHZhcmlhYmxlIGhhcyBvbmx5IG9uZSB0byB0d28gdmFsdWVzIGF0IG1vc3QuIFRoZSAqTmEudmFsdWVzKiBsaW5lIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgdmFsdWVzIGZvciBlYWNoIHZhcmlhYmxlLg0KDQoNCioqVGFibGUgb2YgR2VuZXJhbCBTdGF0aXN0aWNzKiogIA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQojVGFibGUgb2YgR2VuZXJhbCBTdGF0aXN0aWNzIGZvciBIYWJpdGF0IFZhcmlhYmxlDQoNCntzdW1tYXJ5LkVOViA8LSBhcy5kYXRhLmZyYW1lKHQoZG8uY2FsbChjYmluZCwgbGFwcGx5KGRhdGFzZXQuRU5WLCBzdW1tYXJ5KSkpKQ0Kc3VtbWFyeS5FTlYkU3RkLmRldmlhdGlvbiA8LSBhcHBseShkYXRhc2V0LkVOViwgMiwgc2QsIG5hLnJtID0gVCkNCnN1bW1hcnkuRU5WJExlbmd0aCA8LSBjb2xTdW1zKCFpcy5uYShkYXRhc2V0LkVOVikpDQpzdW1tYXJ5LkVOViRCaW5hcnlEYXRhIDwtIHNhcHBseShkYXRhc2V0LkVOVixmdW5jdGlvbih4KWxlbmd0aCh1bmlxdWUobmEub21pdCh4KSkpPD0yKQ0Kc3VtbWFyeS5FTlYkTkEudmFsdWVzIDwtIGNvbFN1bXMoaXMubmEoZGF0YXNldC5FTlYpKQ0Kc3VtbWFyeS5FTlYkYE5BJ3NgIDwtIE5VTEwNCnN1bW1hcnkuRU5WIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5LkVOVikpDQpzdW1tYXJ5LkVOVg0KfQ0KZm9ybWF0dGFibGUoc3VtbWFyeS5FTlYsIGRpZ2l0cyA9IDIsIGFsaWduID0gImMiKQ0KDQpgYGANCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKkNoZWNrIHRoZSBkYXRhIGFuZCBtYWtlIHN1cmUgaXQgcmVmbGVjdHMgcmVhbGl0eS4gRXhhbWluZSBzdGF0aXN0aWNzIGFuZCBpZGVudGlmeSwgaWYgcHJlc2VudCwgYW5vbWFsaWVzIHdpdGggc3RhdGlzdGljcy4NCg0KIyNMb2NhdGlvbiBvZiBIYWJpdGF0IERhdGENCg0KIyMjR2VvZ3JhcGhpY2FsIERpc3RyaWJ1dGlvbiBvZiBIYWJpdGF0IFZhcmlhYmxlcw0KDQpUaGUgZm9sbG93aW5nIGdyYXBocyBzaG93IHRoZSBsb2NhdGlvbiAobGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSkgYW5kIHRoZSBvYnNlcnZlZCB2YWx1ZSBmb3IgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBoYWJpdGF0IGRhdGEgZmlsZS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojR2VvZ3JhcGhpY2FsIERpc3RyaWJ1dGlvbiBvZiBIYWJpdGF0IFZhcmlhYmxlcw0KDQpkYXRhc2V0LkVOVjIgPC0gcm93bmFtZXNfdG9fY29sdW1uKGRhdGFzZXQuRU5WLCB2YXIgPSAicm93bmFtZXMiKQ0KZGF0YXNldC5HRU4yIDwtIHJvd25hbWVzX3RvX2NvbHVtbihkYXRhc2V0LkdFTiwgdmFyID0gInJvd25hbWVzIikNCmlmKCEiTG9uZ2l0dWRlIiAlaW4lIGNvbG5hbWVzKGRhdGFzZXQuRU5WMikpIHsNCiAgZGF0YXNldC5FTlYyIDwtIGxlZnRfam9pbihkYXRhc2V0LkVOVjIsIGRhdGFzZXQuR0VOMlssYygicm93bmFtZXMiLCAiTG9uZ2l0dWRlIiwgIkxhdGl0dWRlIildLCBieSA9ICJyb3duYW1lcyIpDQp9DQoNCnNpemUgPC0gZGF0YXNldC5FTlYyWzI6bmNvbChkYXRhc2V0LkVOVjIpXQ0Kc2l6ZVtjKGxlbmd0aChzaXplKS0yLGxlbmd0aChzaXplKS0xLCBsZW5ndGgoc2l6ZSkpXSA8LSBOQQ0KDQpmb3IoaSBpbiAyOihuY29sKGRhdGFzZXQuRU5WMiktMykpew0KZ3JhcGguZ2VvLmFiIDwtIGdncGxvdChkYXRhc2V0LkVOVjIsIGFlcyhMb25naXR1ZGUsIExhdGl0dWRlKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGFlcyhzaXplID0gc2l6ZVtpLTFdKSkgKw0KICBnZ3RpdGxlKHBhc3RlKCJHZW9ncmFwaGljYWwgRGlzdHJpYnV0aW9uIG9mIHZhcmlhYmxlXG4iLCBjb2xuYW1lcyhkYXRhc2V0LkVOVjJbaV0pKSkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygxLDEwKSwgbmFtZSA9ICJWYWx1ZSIpDQpncmFwaC5nZW8uYWINCnByaW50KGdyYXBoLmdlby5hYikNCn0NCg0KI3JtKHNpemUpDQojcm0oZGF0YXNldC5HRU4yKQ0KYGBgDQoNCiMjI01hcCBvZiBBbHRpdHVkZQ0KDQpUaGUgZm9sbG93aW5nIGludGVyYWN0aXZlIG1hcCBzaG93cyBMYSBjYXJ0ZSBpbnRlcmFjdGl2ZSBzdWl2YW50ZSBpbGx1c3RyZSBsYSBwb3NpdGlvbiBkZXMgc2l0ZXMgZW4gZm9uY3Rpb24gZGVzIGNvb3Jkb25uw6llcyBnw6lvZ3JhcGhpcXVlcyBjb250ZW51ZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGFpbnNpIHF1ZSBsJ2FsdGl0dWRlIHBhciBzaXRlLiBDbGlxdWV6IHN1ciBsZSBtYXJxdWV1ciBkJ3VuZSB2aXNpdGUgcG91ciBpbmRpcXVlciBsJ2FsdGl0dWRlIG9ic2VydsOpZSBkYW5zIGNlbGxlLWNpLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD04LjUsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCiNHZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIG9mIGFsdGl0dWRlDQoNCmRhdGFzZXQuU1BBMiA8LSByb3duYW1lc190b19jb2x1bW4oZGF0YXNldC5TUEEsIHZhciA9ICJyb3duYW1lcyIpDQpkYXRhc2V0Lk5BTTIgPC0gcm93bmFtZXNfdG9fY29sdW1uKGRhdGFzZXQuTkFNLCB2YXIgPSAicm93bmFtZXMiKQ0KaWYoISJTaXRlIiAlaW4lIGNvbG5hbWVzKGRhdGFzZXQuU1BBMikpIHsNCiAgZGF0YXNldC5TUEEyIDwtIGxlZnRfam9pbihkYXRhc2V0LlNQQTIsIGRhdGFzZXQuTkFNMlssIGMoInJvd25hbWVzIiwgIlNpdGUiLCAiU2FtcGxlRGF0ZSIsICJTYW1wbGVOdW1iZXIiKV0sIGJ5ID0gInJvd25hbWVzIikNCn0NCmRhdGFzZXQuU1BBMiRTaXRlX0RhdGVfTnVtYmVyIDwtIHBhc3RlKGRhdGFzZXQuU1BBMiRTaXRlLCAiXyIsIGRhdGFzZXQuU1BBMiRTYW1wbGVEYXRlLCAiXyIsIGRhdGFzZXQuU1BBMiRTYW1wbGVOdW1iZXIpDQpkYXRlcyA8LSBhcy5EYXRlKGRhdGFzZXQuU1BBMiRTYW1wbGVEYXRlLCAiJVktJW0tJWQiKQ0KZGF0YXNldC5TUEEyJFllYXIgPC0gc3RyZnRpbWUocGFyc2VfZGF0ZV90aW1lKGFzLmNoYXJhY3RlcihkYXRlcyksICIlWS0lbS0lZCIpLCAiJXkiKQ0KZGF0YXNldC5TUEEyJFNpdGVfWWVhciA8LSBwYXN0ZShkYXRhc2V0LlNQQTIkU2l0ZSwgIl8iLCBkYXRhc2V0LlNQQTIkWWVhcikNCg0KY2FiaW5Qb2ludHMgPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZShjb29yZHMgPSBkYXRhc2V0LlNQQVssIDE6Ml0sIGRhdGEgPSBkYXRhc2V0LlNQQSkNCiAgDQpnZXRDb2xvcjIgPC0gZnVuY3Rpb24oZGF0YXNldC5TUEEyKSB7DQogIHNhcHBseShkYXRhc2V0LlNQQTIkU2FtcGxlRGF0ZSwgZnVuY3Rpb24oU2FtcGxlRGF0ZSkgew0KICBpZihTYW1wbGVEYXRlIDw9ICIyMDA1LTEyLTMxIikgew0KICAgICJncmVlbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDYtMTItMzEiKSB7DQogICAgInllbGxvdyINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDctMTItMzEiKSB7DQogICAgImRhcmtvcmFuZ2UiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDA4LTEyLTMxIikgew0KICAgICJyZWQiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDA5LTEyLTMxIikgew0KICAgICJwaW5rIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxMC0xMi0zMSIpIHsNCiAgICAiYmx1ZSINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTEtMTItMzEiKSB7DQogICAgImRhcmtncmVlbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTItMTItMzEiKSB7DQogICAgImN5YW4iDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDEzLTEyLTMxIikgew0KICAgICJkZWVwcGluayINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTQtMTItMzEiKSB7DQogICAgImxpZ2h0Ymx1ZSINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTUtMTItMzEiKSB7DQogICAgImxpZ2h0c2VhZ3JlZW4iDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDE2LTEyLTMxIikgew0KICAgICJkYXJrdmlvbGV0Ig0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxNy0xMi0zMSIpIHsNCiAgICAiZGFya3JlZCINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTgtMTItMzEiKSB7DQogICAgImNhZGV0Ymx1ZSINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTktMTItMzEiKSB7DQogICAgImJsYWNrIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAyMC0xMi0zMSIpIHsNCiAgICAiZ3JheSINCiAgfSBlbHNlIHsNCiAgICAiYnJvd24iDQogIH0gfSkNCn0gDQoNCiNkYXRlcyA8LSBhcy5EYXRlKGRhdGFzZXQuU1BBMiRTYW1wbGVEYXRlLCAiJVktJW0tJWQiKSANCiNkYXRhc2V0LlNQQTIkWWVhciA8LSBzdHJmdGltZShwYXJzZV9kYXRlX3RpbWUoYXMuY2hhcmFjdGVyKGRhdGVzKSwgIiVZLSVtLSVkIiksICIlWSIpDQoNCiAgbGVhZmxldChkYXRhID0gZGF0YXNldC5TUEEyKSAlPiUgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZFRvcG9NYXApICU+JSBhZGRDaXJjbGVNYXJrZXJzKH5Mb25naXR1ZGUsIH5MYXRpdHVkZSwgcG9wdXAgPSBwYXN0ZSggIlNpdGVfWWVhciA6ICIsIGRhdGFzZXQuU1BBMiRTaXRlX1llYXIsICI8YnI+IiwgIkFsdGl0dWRlIDogIiwgZGF0YXNldC5FTlYyJEFsdGl0dWRlLCAiPGJyPiIpLCBsYWJlbCA9IChkYXRhc2V0LlNQQTIkU2l0ZV9ZZWFyKSwgcmFkaXVzID0gZGF0YXNldC5FTlYyJEFsdGl0dWRlLCBjb2xvciA9IGdldENvbG9yMihkYXRhc2V0LlNQQTIpLCBzdHJva2UgPSBGLCBmaWxsT3BhY2l0eSA9IDAuNSwgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpKSAlPiUgYWRkTGVnZW5kKA0KICBwb3NpdGlvbiA9ICdib3R0b21yaWdodCcsDQogIGNvbG9ycyA9IHBhbGV0dGUoKSwNCiAgbGFiZWxzID0gcGFsZXR0ZSgpLA0KICBvcGFjaXR5ID0gMSwNCiAgdGl0bGUgPSAnTGVnZW5kJykNCiAgDQpybShkYXRhc2V0LlNQQTIpDQoNCmBgYA0KDQojI1ByZXNlbmNlIG9mIE91dGxpZXJzDQoNCiMjI0Rpc3BlcnNpb24gb2YgT2JzZXJ2ZWQgVmFsdWVzDQoNClRoZSBmb2xsb3dpbmcgc2NhdHRlcnBsb3RzIHByZXNlbnQgdGhlIHZhbHVlIG9mIHRoZSBjb250aW51b3VzIHZhcmlhYmxlIGRhdGEgb2JzZXJ2ZWQgaW4gdGhlIGRhdGFzZXQuIEJlbG93IHRoZSB4LWF4aXMgaXMgdGhlIHZpc2l0IGlkZW50aWZpZXIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG9ic2VydmVkIHZhbHVlLCBuYW1lbHkgdGhlIG5hbWUgb2YgdGhlIHNpdGUgZnJvbSB3aGljaCB0aGUgZGF0YSBvcmlnaW5hdGVkLCBpdHMgc2FtcGxpbmcgZGF0ZSBhbmQgdGhlIHNhbXBsaW5nIG51bWJlci4NCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKkNoZWNrIHRoZSBkYXRhIGFuZCBtYWtlIHN1cmUgaXQgcmVmbGVjdHMgcmVhbGl0eS4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZzoqDQo+DQo+IC0gKkRvIGRhdGEgc2VlbSBvdXQgb2YgdGhlIG9yZGluYXJ5PyoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojU2NhdHRlcnBsb3RzIG9mIG9ic2VydmVkIHZhbHVlcyBmb3IgaGFiaXRhdCBkYXRhDQoNCmRhdGFzZXQuTkFNMiRTaXRlX0RhdGVfTnVtYmVyIDwtIHBhc3RlKGRhdGFzZXQuTkFNMiRTaXRlLCAiXyIsIGRhdGFzZXQuTkFNMiRTYW1wbGVEYXRlLCAiXyIsIGRhdGFzZXQuTkFNMiRTYW1wbGVOdW1iZXIpDQppZighIlNpdGVfRGF0ZV9OdW1iZXIiICVpbiUgY29sbmFtZXMoZGF0YXNldC5FTlYyKSkgew0KICBkYXRhc2V0LkVOVjIgPC0gbGVmdF9qb2luKGRhdGFzZXQuRU5WMiwgZGF0YXNldC5OQU0yWyxjKCJyb3duYW1lcyIsICJTaXRlX0RhdGVfTnVtYmVyIildLCBieSA9ICJyb3duYW1lcyIpDQp9DQoNCmZvcihqIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQogIHBsb3QuYWIgPC0gZ2dwbG90KGRhdGFzZXQuRU5WMiwgYWVzKHggPSBkYXRhc2V0LkVOVjIkU2l0ZV9EYXRlX051bWJlciwgeSA9IGRhdGFzZXQuRU5WMlssal0pKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnMoeSA9ICJWYWx1ZSIsIHggPSAiVmlzaXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLTAuMDUpKSArDQogICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGlmZWxzZSghaXMubmEoZGF0YXNldC5FTlYyWyxqXSksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIiksIGxhYmVscyA9IGlmZWxzZSghaXMubmEoZGF0YXNldC5FTlYyWyxqXSksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIiksIG5hLnZhbHVlID0gTkEpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiT2JzZXJ2ZWQgVmFsdWVzIGZvciIsIGNvbG5hbWVzKGRhdGFzZXQuRU5WMltqXSksICJwZXIgdmlzaXQiKSkNCnBsb3QuYWINCnByaW50KHBsb3QuYWIpDQp9DQoNCmBgYA0KDQoNCiMjI0ZyZXF1ZW5jeSBEaXN0cmlidXRpb24NCg0KVGhlIGZvbGxvd2luZyB0YWJsZXMgc2hvdyB0aGUgbGlzdCBvZiB2YWx1ZXMgb2JzZXJ2ZWQgYnkgdmFyaWFibGUgYW5kIHRoZWlyIGZyZXF1ZW5jeSB3aXRoaW4gdGhlIGhhYml0YXQgZGF0YSBmaWxlLiBUaGVzZSB0YWJsZXMgbWFrZSBpdCBwb3NzaWJsZSBpbiBwYXJ0aWN1bGFyIHRvIHZlcmlmeSBhbmQgdmFsaWRhdGUgdGhlIHVuaWZvcm1pdHkgb2YgdGhlIHZhbHVlIG5hbWluZyBmb3IgY2F0ZWdvcmljYWwgdmFyaWFibGVzIG9ic2VydmVkIGluIHRoZSBkYXRhIGZpbGUuIElmIHRoZSBzYW1lIHZhbHVlIGlzIGxpc3RlZCB0d2ljZSBpbiB0aGUgc2FtZSBmcmVxdWVuY3kgdGFibGUsIGl0IGlzIHBvc3NpYmxlIHRoYXQgb25lIG9mIHRoZXNlIHZhbHVlcyB3YXMgd3JpdHRlbiB3aXRoIG9uZSBvciBtb3JlIHNwYWNlcyBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHdvcmQsIHdoaWNoIGNvdWxkIGV4cGxhaW4gdGhlIGRpZmZlcmVuY2UgaW4gdGhlIHNwZWxsaW5nIG9mIHZhbHVlcyB0aGF0IHdhcyBkZXRlY3RlZCBieSB0aGUgc29mdHdhcmUuDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpGb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcywgY2hlY2sgdGhlIGRhdGEgYW5kIG1ha2Ugc3VyZSBpdCByZWZsZWN0cyByZWFsaXR5LiBDb25zaWRlciB0aGUgZm9sbG93aW5nOioNCj4NCj4gLSAqSXMgbmFtaW5nIGNvbnNpc3RlbnQ/Kg0KPiAtICpBcmUgZnJlcXVlbmNpZXMgY29uc2lzdGVudCB3aXRoIHJlYWxpdHk/Kg0KDQoNCg0KIyNQcmVzZW5jZSBvZiBPdXRsaWVycw0KDQojIyNEaXNwZXJzaW9uIG9mIE9ic2VydmVkIFZhbHVlcw0KDQpUaGUgZm9sbG93aW5nIHNjYXR0ZXJwbG90cyBwcmVzZW50IHRoZSB2YWx1ZSBvZiB0aGUgY29udGludW91cyB2YXJpYWJsZSBkYXRhIG9ic2VydmVkIGluIHRoZSBkYXRhc2V0LiBCZWxvdyB0aGUgeC1heGlzIGlzIHRoZSB2aXNpdCBpZGVudGlmaWVyIGZvciB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZlZCB2YWx1ZSwgbmFtZWx5IHRoZSBuYW1lIG9mIHRoZSBzaXRlIGZyb20gd2hpY2ggdGhlIGRhdGEgb3JpZ2luYXRlZCwgaXRzIHNhbXBsaW5nIGRhdGUgYW5kIHRoZSBzYW1wbGluZyBudW1iZXIuDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpDaGVjayB0aGUgZGF0YSBhbmQgbWFrZSBzdXJlIGl0IHJlZmxlY3RzIHJlYWxpdHkuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmc6Kg0KPg0KPiAtICpEbyBkYXRhIHNlZW0gb3V0IG9mIHRoZSBvcmRpbmFyeT8qDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1NjYXR0ZXJwbG90cyBvZiBvYnNlcnZlZCB2YWx1ZXMNCg0KZGF0YXNldC5OQU0yJFNpdGVfRGF0ZV9OdW1iZXIgPC0gcGFzdGUoZGF0YXNldC5OQU0yJFNpdGUsICJfIiwgZGF0YXNldC5OQU0yJFNhbXBsZURhdGUsICJfIiwgZGF0YXNldC5OQU0yJFNhbXBsZU51bWJlcikNCiNkYXRhc2V0LkVOVjIgPC0gbGVmdF9qb2luKGRhdGFzZXQuRU5WMiwgZGF0YXNldC5OQU0yWyxjKCJyb3duYW1lcyIsICJTaXRlX0RhdGVfTnVtYmVyIildLCBieSA9ICJyb3duYW1lcyIpDQoNCmZvcihqIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQpwbG90LmFiIDwtIGdncGxvdChkYXRhc2V0LkVOVjIsIGFlcyh4ID0gZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsIHkgPSBkYXRhc2V0LkVOVjJbLGpdKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHkgPSAiVmFsdWUiLCB4ID0gIlZpc2l0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC0wLjA1KSkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBpZmVsc2UoIWlzLm5hKGRhdGFzZXQuRU5WMlssal0pLCBkYXRhc2V0LkVOVjIkU2l0ZV9EYXRlX051bWJlciwgIiIpLCBsYWJlbHMgPSBpZmVsc2UoIWlzLm5hKGRhdGFzZXQuRU5WMlssal0pLCBkYXRhc2V0LkVOVjIkU2l0ZV9EYXRlX051bWJlciwgIiIpLCBuYS52YWx1ZSA9IE5BKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbiBvZiBPYnNlcnZlZCBWYWx1ZXNcbmZvciIsIGNvbG5hbWVzKGRhdGFzZXQuRU5WMltqXSksICJwZXIgdmlzaXQiKSkNCnBsb3QuYWINCnByaW50KHBsb3QuYWIpDQp9DQoNCmBgYA0KDQojIyNCb3hwbG90cyBvZiBPYnNlcnZlZCBhbmQgVHJhbnNmb3JtZWQgVmFsdWVzDQoNClRoZSBmaXJzdCBib3hwbG90IChsZWZ0KSBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvbnRpbnVvdXMgdmFyaWFibGUgdmFsdWVzIG9ic2VydmVkIGluIHRoZSBkYXRhIGZpbGUsIGFuZCB0aGUgc2Vjb25kIGJveCBwbG90IChyaWdodCkgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nYXJpdGhtaWMtdHJhbnNmb3JtZWQgdmFsdWVzLg0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqQ2hlY2sgdGhlIGRhdGEgYW5kIG1ha2Ugc3VyZSBpdCByZWZsZWN0cyByZWFsaXR5LiBDb25zaWRlciB0aGUgZm9sbG93aW5nOioNCj4NCj4gLSAqRG8gZGF0YSBzZWVtIG91dCBvZiB0aGUgb3JkaW5hcnk/Kg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCb3hwbG90cyBvZiBPYnNlcnZlZCBhbmQgVHJhbnNmb3JtZWQgVmFsdWVzDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQpib3guYWIuMSA8LSBxcGxvdCh5ID0gZGF0YXNldC5FTlYyWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSkgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiT2JzZXJ2ZWQgVmFsdWVzIikpDQpib3guYWIuMiA8LSBxcGxvdCh5ID0gZGF0YXNldC5FTlYyWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gcGFzdGUoIkxvZygiLCBjb2xuYW1lcyhkYXRhc2V0LkVOVjJbaV0pLCIpIiksIGxvZyA9ICJ5IikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiTG9nIFZhbHVlcyIpKQ0KDQpncmlkLmFycmFuZ2UoYm94LmFiLjEsIGJveC5hYi4yLCBuY29sID0gMiwgdG9wID0gY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSkNCn0NCg0KYGBgDQoNCiMjI0lkZW50aWZpY2F0aW9uIG9mIFBvdGVudGlhbCBPdXRsaWVycw0KDQpGb3IgZWFjaCB2YXJpYWJsZSwgdGhlIGZpcnN0IGJveHBsb3QgKGxlZnQpIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgY29udGludW91cyB2YXJpYWJsZSB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIGRhdGFzZXQgYW5kIHRoZSBkaXNwZXJzaW9uIGRpYWdyYW0gKHJpZ2h0KSBzaG93IHRoZSBkaXN0cmlidXRpb24gb2Ygb2JzZXJ2ZWQgY29udGludW91cyB2YXJpYWJsZSB2YWx1ZXMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoaXMgZmlsZS4gRGF0YSB3aXRoIGlkZW50aWZpY2F0aW9uIGJ5IHRoZWlyIGlkZW50aWZpZXIgb24gdGhlIGRpYWdyYW1zIGFyZSBwb3RlbnRpYWxseSBvdXRsaWVycyBjb250YWluZWQgaW4gdGhlIGRhdGFzZXQuIFRoZSBtZXRob2QgdXNlZCB0byBpZGVudGlmeSBwb3RlbnRpYWxseSBvdXRsaWVycyBpcyB0aGUgaW50ZXJxdWFudGlsZSByYW5nZSAoKklRUiopLiBUaGUgSVFSIGlzIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoNCg0KYElRUih4KSA9IHF1YW50aWxlKHgsIDMvNCkgLSBxdWFudGlsZSh4LCAxLzQpYA0KDQoNClBvdGVudGlhbCBvdXRsaWVycyBhcmUgZGVmaW5lZCBhcyB2YWx1ZXMgYmVsb3cgKlExIC0gMSw1IElRUiogb3IgYWJvdmUgKlEzICsgMSw1IElRUiouDQoNClRoZSBpZGVudGlmaWVyIG9mIHRoZSB2aXNpdCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSBvZiB0aGUgc2l0ZSBmcm9tIHdoaWNoIHRoZSBkYXRhIG9yaWdpbmF0ZWQsIGl0cyBzYW1wbGluZyBkYXRlIGFuZCB0aGUgc2FtcGxlIG51bWJlciBmb3IgdGhpcyB2aXNpdC4NCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKkNoZWNrIHRoZSBmb2xsb3dpbmcgZ3JhcGhzIGFuZCBwdXQgeW91ciBhdHRlbnRpb24gb24gdGhlIHBvaW50cyB3aXRoIGEgbGFiZWwgKGlmIHByZXNlbnQpLiBDb25zaWRlciB0aGUgZm9sbG93aW5nOioNCj4NCj4gLSAqQXJlIHBvdGVudGlhbCBvdXRsaWVycyB0cnVseSBhYmVycmFudD8qDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojSWRlbnRpZmljYXRpb24gb2YgcG90ZW50aWFsIG91dGxpZXJzDQoNCmZvciAoaiBpbiAyOihuY29sKGRhdGFzZXQuRU5WMiktMykpIHsNCiAgYm94cGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGRhdGFzZXQuRU5WMiwgYWVzKHggPSAiIiwgeSA9IGRhdGFzZXQuRU5WMlssal0pKSArDQogICAgZ2VvbV9ib3hwbG90KCkgKw0KICAgIHlsYWIoIlZhbHVlIikgKw0KICAgIHhsYWIoIiIpICsNCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICAgIGdndGl0bGUocGFzdGUoIk9ic2VydmVkIFZhbHVlcyIpKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShkYXRhc2V0LkVOVjJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5FTlYyWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkVOVjJbLGpdLCBuYS5ybSA9IFQpfGRhdGFzZXQuRU5WMlssal0gPiBxdWFudGlsZShkYXRhc2V0LkVOVjJbLGpdLCBwcm9icz1jKC43NSksIG5hLnJtID0gVCkgKyAxLjUqSVFSKGRhdGFzZXQuRU5WMlssal0sIG5hLnJtID0gVCksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIikpLCBoanVzdCA9IC0wLjA1LCBzaXplID0gMykNCg0KICBkb3RjaGFydCA8LSBnZ3Bsb3QoZGF0YSA9IGRhdGFzZXQuRU5WMiwgYWVzKHkgPSBzZXEoZGF0YXNldC5FTlYyWyxqXSksIHggPSBkYXRhc2V0LkVOVjJbLGpdLCBuYS5ybSA9IFQpKSArDQogICAgZ2VvbV9wb2ludChuYS5ybSA9IFQpICsNCiAgICB5bGFiKCJEYXRhIE9yZGVyIikgKw0KICAgIHhsYWIoIlZhbHVlIikgKw0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogICAgZ2d0aXRsZShwYXN0ZSgiT2JzZXJ2ZWQgVmFsdWVzIikpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaWZlbHNlKGRhdGFzZXQuRU5WMlssal0gPCBxdWFudGlsZShkYXRhc2V0LkVOVjJbLGpdLCBwcm9icz1jKC4yNSksIG5hLnJtID0gVCkgLSAxLjUqSVFSKGRhdGFzZXQuRU5WMlssal0sIG5hLnJtID0gVCl8ZGF0YXNldC5FTlYyWyxqXSA+IHF1YW50aWxlKGRhdGFzZXQuRU5WMlssal0sIHByb2JzPWMoLjc1KSwgbmEucm0gPSBUKSArIDEuNSpJUVIoZGF0YXNldC5FTlYyWyxqXSwgbmEucm0gPSBUKSwgZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsICIiKSksIGhqdXN0ID0gLTAuMDUsIG51ZGdlX3kgPSAyLCBzaXplID0gMykNCiAgICAgICAgDQogIGdyaWQuYXJyYW5nZShib3hwbG90LCBkb3RjaGFydCwgbmNvbCA9IDIsIHRvcCA9IGNvbG5hbWVzKGRhdGFzZXQuRU5WMltqXSkpDQp9DQoNCmBgYA0KDQpUaGUgZm9sbG93aW5nIGxpc3Qgc2hvd3MgYW5vdGhlciB3YXkgb2YgaWRlbnRpZnlpbmcgcG90ZW50aWFsIG91dGxpZXJzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBmaWxlIGZvciBlYWNoIHZhcmlhYmxlLiBXaGVuIHRoZSBpZGVudGlmaWVyIG9mIGEgZGF0YSBpdGVtIGlzIGluZGljYXRlZCB0aGVyZWluLCB0aGlzIGluZGljYXRlcyB0aGF0IHRoaXMgZGF0YSByZXByZXNlbnRzIHBvdGVudGlhbGx5IGFiZXJyYW50IGRhdGEgY29udGFpbmVkIGluIHRoZSBkYXRhIGZpbGUuICoiIiogaW5kaWNhdGVzIG5vbi1hYmVycmFudCBkYXRhIGFuZCAqTkEqIGluZGljYXRlcyBtaXNzaW5nIHZhbHVlcy4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHZpc2l0IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSBzaXRlIGZyb20gd2hpY2ggdGhlIGRhdGEgb3JpZ2luYXRlZCwgaXRzIHNhbXBsaW5nIGRhdGUgYW5kIHRoZSBzYW1wbGluZyBudW1iZXIuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0lkZW50aWZpY2F0aW9uIG9mIFBvdGVudGlhbCBPdXRsaWVycyAocGFydCAyKQ0KDQpmb3IgKGogaW4gMjoobmNvbChkYXRhc2V0LkVOVjIpLTMpKSB7DQpwcmludChjb2xuYW1lcyhkYXRhc2V0LkVOVjJbal0pKQ0KbGlzdCA8LSBsaXN0KGlmZWxzZShkYXRhc2V0LkVOVjJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5FTlYyWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkVOVjJbLGpdLCBuYS5ybSA9IFQpIHwgZGF0YXNldC5FTlYyWyxqXSA+IHF1YW50aWxlKGRhdGFzZXQuRU5WMlssal0sIHByb2JzPWMoLjc1KSwgbmEucm0gPSBUKSArIDEuNSpJUVIoZGF0YXNldC5FTlYyWyxqXSwgbmEucm0gPSBUKSwgZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsICIiKSkNCnByaW50KGxpc3QpDQp9DQoNCmBgYA0KIyNEYXRhIE5vcm1hbGl0eSANCg0KIyMjUXVhbnRpbGUtUXVhbnRpbGUgRGlhZ3JhbXMgYW5kIEZyZXF1ZW5jeSBIaXN0b2dyYW1zDQoNCkZvciBlYWNoIHZhcmlhYmxlLCB0aGUgZmlyc3QgZ3JhcGggKGxlZnQpIHNob3dzIHRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb24gb2YgdmFyaWFibGUgdmFsdWVz4oCLYnkgcG9pbnRzIGFuZCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiBjYWxjdWxhdGVkIGZyb20gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvYnNlcnZlZCBieSBhIHN0cmFpZ2h0IGxpbmUuIFRoZSBtb3JlIHRoZSBvYnNlcnZlZCB2YWx1ZXMgYXJlIHBvc2l0aW9uZWQgYWxvbmcgdGhlIGxpbmUsIHRoZSBtb3JlIHRoZXkgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgbm9ybWFsaXR5Lg0KDQpUaGUgc2Vjb25kIGdyYXBoIChtaWRkbGUpIGlsbHVzdHJhdGVzIGEgZnJlcXVlbmN5IGhpc3RvZ3JhbSBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWVz4oCLdGF4b24uIFRoaXMgaGlzdG9ncmFtIGFsc28gc2hvd3MgdGhlIGF2ZXJhZ2UgdmFsdWUgcGVyIHZhcmlhYmxlIGJ5IGEgc29saWQgbGluZSBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgdHdvIHZhcmlhYmxlcyBieSBkb3R0ZWQgbGluZXMuDQoNClRoZSB0aGlyZCBncmFwaCAocmlnaHQpIGlsbHVzdHJhdGVzIHRoZSBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIG9mIHRoZSBvYnNlcnZlZCB2YWx1ZXMgcGVyIHZhcmlhYmxlIHRoYXQgYXJlIGxvZy10cmFuc2Zvcm1lZC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YSBvbiB0aGlzIGdyYXBoIHNlZW1zIHRvIGJlIG1vcmUgbGlrZSBhIG5vcm1hbCBkaXN0cmlidXRpb24sIGEgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGRhdGEgbWlnaHQgYmUgdXNlZnVsLiBUaGlzIGhpc3RvZ3JhbSBhbHNvIGlsbHVzdHJhdGVzIHRoZSBhdmVyYWdlIHZhbHVlIHBlciB2YXJpYWJsZSBieSBhIHNvbGlkIGxpbmUgYXMgd2VsbCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSB2YXJpYWJsZXMgYnkgdHdvIGRhc2hlZCBsaW5lcy4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojUXVhbnRpbGUtUXVhbnRpbGUgZGlhZ3JhbXMgYW5kIGhpc3RvZ3JhbXMNCg0KI2ZvciAoaSBpbiAxOm5jb2woZGF0YXNldC5FTlYpKXsNCmZvciAoaSBpbiAxOjI4KXsNCm5vcm0ubWVhbiA8LSBtZWFuKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkNCm5vcm0uc2QgPC0gc2Qod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKQ0Kbm9ybS5uIDwtIGxlbmd0aCh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpDQpub3JtLmJpbiA8LSBjZWlsaW5nKG1heCh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpLSBtaW4od2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKS9uY2xhc3MuU3R1cmdlcyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKQ0KDQpwYXIobWZyb3cgPSBjKDEsMyksIG9tYT1jKDEsMSwyLDEpKQ0KDQpxcW5vcm0od2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpLCBtYWluID0gIlF1YW50aWxlLVF1YW50aWxlIERpYWdyYW0iKQ0KcXFsaW5lKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSxsdHkgPSAyKQ0KDQpoaXN0LmFiIDwtIGhpc3QoYXMubnVtZXJpYyh1bmxpc3QoZGF0YXNldC5FTlZbLGldKSksIGJyZWFrcyA9ICJTdHVyZ2VzIiwgeGxhYiA9ICJWYWx1ZSIsIHlsYWIgPSAiRnJlcXVlbmN5IiwgbWFpbiA9ICJGcmVxdWVuY3kgRGlzdHJpYnV0aW9uIikNCnhmaXQgPC0gc2VxKG1pbih3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpLCBtYXgod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKSwgbGVuZ3RoPW5vcm0ubikNCnlmaXRfZGVuc2l0eSA8LSBkbm9ybSh4Zml0LCBtZWFuID0gbm9ybS5tZWFuLCBzZD1ub3JtLnNkKQ0KeWZpdF9mcmVxIDwtIHlmaXRfZGVuc2l0eSpkaWZmKGhpc3QuYWIkbWlkc1sxOjJdKSpub3JtLm4NCmxpbmVzKHhmaXQsIHlmaXRfZnJlcSwgY29sPSJyZWQiLCBsd2Q9MSkNCiAgYWJsaW5lKHYgPSBub3JtLm1lYW4sIGNvbCA9ICJibHVlIikgKw0KICBhYmxpbmUodiA9IG5vcm0ubWVhbiArIG5vcm0uc2QsIGx0eSA9IDIsIGNvbCA9ICJibHVlIikgKw0KICBhYmxpbmUodiA9IG5vcm0ubWVhbiAtIG5vcm0uc2QsIGx0eSA9IDIsIGNvbCA9ICJibHVlIikNCg0Kbm9ybS5tZWFuLmxvZyA8LSBtZWFuKGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKQ0Kbm9ybS5zZC5sb2cgPC0gc2QobG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpDQpub3JtLm4ubG9nIDwtIGxlbmd0aChsb2cod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKSkNCiNub3JtLmJpbi5sb2cgPC0gY2VpbGluZyhtYXgobG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpLSBtaW4obG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpL25jbGFzcy5TdHVyZ2VzKGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKSkNCiAgDQpoaXN0LmFiLjIgPC0gdHJ5Q2F0Y2goaGlzdChsb2coYXMubnVtZXJpYyh1bmxpc3QoZGF0YXNldC5FTlZbLGldKSkpLCBicmVha3MgPSAiU3R1cmdlcyIsIHhsYWIgPSAiTG9nKFZhbHVlKSIsIHlsYWIgPSAiRnJlcXVlbmN5IiwgbWFpbiA9ICJGcmVxdWVuY3kgRGlzdHJpYnV0aW9uIChsb2cpIiksIGVycm9yPWZ1bmN0aW9uKGUpIHBsb3QubmV3KCkpDQp4Zml0IDwtIHNlcShtaW4obG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpLCBtYXgobG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpLCBsZW5ndGg9bm9ybS5uLmxvZykNCnlmaXRfZGVuc2l0eSA8LSBkbm9ybSh4Zml0LCBtZWFuID0gbm9ybS5tZWFuLmxvZywgc2Q9bm9ybS5zZC5sb2cpDQp5Zml0X2ZyZXEgPC0geWZpdF9kZW5zaXR5KmRpZmYoaGlzdC5hYi4yJG1pZHNbMToyXSkqbm9ybS5uLmxvZw0KbGluZXMoeGZpdCwgeWZpdF9mcmVxLCBjb2w9InJlZCIsIGx3ZD0xKQ0KICBhYmxpbmUodiA9IG5vcm0ubWVhbi5sb2csIGNvbCA9ICJibHVlIikgKw0KICBhYmxpbmUodiA9IG5vcm0ubWVhbi5sb2cgKyBub3JtLnNkLmxvZywgbHR5ID0gMiwgY29sID0gImJsdWUiKSArDQogIGFibGluZSh2ID0gbm9ybS5tZWFuLmxvZyAtIG5vcm0uc2QubG9nLCBsdHkgPSAyLCBjb2wgPSAiYmx1ZSIpDQptdGV4dChjb2xuYW1lcyhkYXRhc2V0LkVOVltpXSksIGNleCA9IDEuMiwgb3V0ZXIgPSBUUlVFKQ0KDQogIH0NCg0KYGBgDQoNCiMjI0JveHBsb3RzIG9mIE9ic2VydmVkIFZhbHVlcw0KDQpGb3IgZWFjaCB2YXJpYWJsZSwgdGhlIGZpcnN0IGJveHBsb3QgKGxlZnQpIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2Ygb2JzZXJ2ZWQgdmFsdWVzIGluIHRoZSBkYXRhIGZpbGUgd2hlcmVhcyB0aGUgc2Vjb25kIGJveHBsb3QgKHJpZ2h0KSBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIG9ic2VydmVkIHZhbHVlcyBpbiB0aGUgZGF0YSBmaWxlIHRoYXQgaGFzIHVuZGVyZ29uZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbi4NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQm94cGxvdCBvZiBPYnNlcnZlZCBWYWx1ZXMgZm9yIGhhYml0YXQgdmFyaWFibGVzDQoNCmZvcihpIGluIDE6bmNvbChkYXRhc2V0LkVOVikpew0KYm94LmFiLjEgPC0gcXBsb3QoeSA9IGRhdGFzZXQuRU5WWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIlZhbHVlIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiUmF3IGRhdGEiKSkNCmJveC5hYi4yIDwtIHFwbG90KHkgPSBkYXRhc2V0LkVOVlssaV0sIHggPSAiIiwgZ2VvbSA9ICJib3hwbG90IiwgeWxhYiA9ICJMb2coVmFsdWUpIiwgbG9nID0gInkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBnZ3RpdGxlKHBhc3RlKCJMb2ctdHJhbnNmb3JtZWQgZGF0YSIpKQ0KDQpncmlkLmFycmFuZ2UoYm94LmFiLjEsIGJveC5hYi4yLCBuY29sID0gMiwgdG9wID0gY29sbmFtZXMoZGF0YXNldC5FTlZbaV0pKQ0KfQ0KDQpgYGANCg0KIyMjTm9ybWFsaXR5IFRlc3RzDQoNCkxlcyByw6lzdWx0YXRzIHN1aXZhbnRzIHByw6lzZW50ZW50IGxlIHLDqXN1bHRhdCBvYnRlbnUgcGFyIHVuIHRlc3QgZGUgU25vd3MgYXBwbGlxdcOpIHN1ciBjaGFxdWUgdmFyaWFibGUgZHUgZmljaGllciBkZSBkb25uw6llcy4gVW5lIHZhbGV1ciBkZSBQIChwLXZhbHVlKSBpbmbDqXJpZXVyZSDDoCAwLjA1IGluZGlxdWUgcXUnaWwgbidlc3QgcGFzIHBvc3NpYmxlIGRlIHN1cHBvc2VyIHF1ZSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHN1aXQgbGEgbG9pIG5vcm1hbGUgYXZlYyB1bmUgcHJvYmFiaWxpdMOpIGRlIDk1JS4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Nub3dzIE5vcm1hbGl0eSBUZXN0cw0KDQphcHBseShkYXRhc2V0LkVOViwgMiwgU25vd3NQZW51bHRpbWF0ZU5vcm1hbGl0eVRlc3QpDQoNCiNBIHAtdmFsdWUgYmVsb3cgMC4wNSBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gY29uc2lkZXIgdGhlIGRhdGEgZm9sbG93cyBhIG5vcm1hbCBkaXN0cmlidXRpb24gYXMgbm9ybWFsLiANCg0KYGBgDQoNCiMjQ29sbGluZWFyaXR5IG9mIFZhcmlhYmxlcw0KDQojIyNTY2F0dGVycGxvdCBNYXRyaXgNCg0KVGhlIGZvbGxvd2luZyBzY2F0dGVycGxvdCBtYXRyaXggaWxsdXN0cmF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBhaXJzIG9mIHZhcmlhYmxlcy4gSXQgaGVscHMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBjb3JyZWxhdGlvbnMgYmV0d2VlbiB2YXJpYWJsZXMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1NjYXR0ZXJwbG90IE1hdHJpeA0KDQpkYXRhc2V0LkVOVltpcy5uYShkYXRhc2V0LkVOVildIDwtIDANCg0KQWxsUyA8LSBuYW1lcyhkYXRhc2V0LkVOVikNCkVudiA8LSBkYXRhc2V0LkVOVlssQWxsU10NCg0KUGxvdE1hdHJpeChFbnYsIG5yb3dzID0gMywgbmNvbHMgPSAzLCBwYW5lbCA9IHBhbmVsLnNtb290aCkNCg0KZGF0YXNldC5FTlZbZGF0YXNldC5FTlYgPT0gMF0gPC0gTkENCg0KYGBgDQoNCg0KIyMjVGVtcG9yYWwgSW5kZXBlbmRlbmNlIG9mIFZhcmlhYmxlcw0KDQpGb3IgZWFjaCB2YXJpYWJsZSwgdGhlIGZpcnN0IGdyYXBoICh0b3AgbGVmdCkgc2hvd3MgdGhlIG9ic2VydmVkIHZhbHVlIG9mIHRoZSBkYXRhIGFjY29yZGluZyB0byB0aGVpciBzYW1wbGluZyB5ZWFyLiBUaGUgc2Vjb25kIGdyYXBoICh0b3AgcmlnaHQpIGlsbHVzdHJhdGVzIHRoZSBvYnNlcnZlZCB0cmVuZHMgaW4gY2hhbmdlcyBpbiBkYXRhIHZhbHVlcyBvdmVyIHRpbWUuIFRoZSB0aGlyZCBncmFwaCAoYm90dG9tIGxlZnQpIHNob3dzIGZ1dHVyZSBmb3JlY2FzdHMgb2YgY2hhbmdlcyBpbiB2YWx1ZXMgb3ZlciB0aW1lLiBPbiB0aGlzIGdyYXBoLCB0aGUgYmx1ZSBsaW5lIGNvcnJlc3BvbmRzIHRvIHRoZSBleHBlY3RlZCBhdmVyYWdlIHRyZW5kIG9mIGNoYW5nZXMgb3ZlciB0aW1lLCB0aGUgZGFyayBncmF5IHpvbmUgY29ycmVzcG9uZHMgdG8gYSBjb25maWRlbmNlIGludGVydmFsIG9mIDgwJSBhbmQgdGhlIHBhbGUgZ3JheSB6b25lIGNvcnJlc3BvbmRzIHRvIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFRoZSBmb3VydGggZ3JhcGggKGJvdHRvbSByaWdodCkgaWxsdXN0cmF0ZXMgdGltZSBzZXJpZXMgYXV0b2NvcnJlbGF0aW9uIChBQ0YpLiBBbiBhdXRvY29ycmVsYXRpb24gdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpbGx1c3RyYXRlZCBieSB0aGUgZG90dGVkIGxpbmUgaW5kaWNhdGVzIGEgcG9zc2libGUgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB2YXJpYWJsZSBhbmQgdGhlIHRpbWUgb2YgeWVhciAodGltZSkuIEZvciBleGFtcGxlLCBhIGNlcnRhaW4gdmFsdWUgb2YgYSB2YXJpYWJsZSBvYnNlcnZlZCBpbiBhIGdpdmVuIHllYXIgY291bGQgYmUgZXhwbGFpbmVkIGJ5IGEgY2VydGFpbiBldmVudCBmcm9tIGEgcHJldmlvdXMgeWVhciAobGFnIGluIHRpbWUgaW4geWVhcnMpLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgYXV0b2NvcnJlbGF0aW9uIGF0IG9mZnNldCB0aW1lIDAgaXMsIGJ5IGRlZmluaXRpb24sIGVxdWFsIHRvIDEuDQoNCioqQmV3YXJlIHRoYXQgdmFyaWFibGVzIHdpdGggYSBsb3Qgb2YgbWlzc2luZyB2YWx1ZXMgY2FuIGludGVycnVwdCB0aGlzIHByb2NlZHVyZS4qKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNUZW1wb3JhbCBJbmRlcGVuZGVuY2Ugb2YgVmFyaWFibGVzDQoNCmRhdGFzZXQuRU5WMiA8LSBsZWZ0X2pvaW4oZGF0YXNldC5FTlYyLCBkYXRhc2V0Lk5BTTJbLGMoInJvd25hbWVzIiwgIlNhbXBsZURhdGUiKV0sIGJ5ID0gInJvd25hbWVzIikNCmRhdGFzZXQuRU5WMiRTdHJlYW1PcmRlciA8LSBOVUxMDQoNCiNkYXRhc2V0LkVOVjJbaXMubmEoZGF0YXNldC5FTlYyKV0gPC0gMA0KDQpmb3IoaSBpbiAyOihuY29sKGRhdGFzZXQuRU5WMiktNCkpew0KICBwYXIobWZyb3cgPSBjKDIsIDIpLCBvbWEgPSBjKDEsMSwyLDEpKQ0KICBncmFwaC50aW1lIDwtIHBsb3QoZGF0YXNldC5FTlYyJFNhbXBsZURhdGUsIGRhdGFzZXQuRU5WMlssaV0sIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiVmFsdWUiLCBtYWluID0gIk9ic2VydmVkIHZhbHVlcyIpDQoNCiAgZ3JhcGgudGltZTIgPC0gdHMoZGF0YXNldC5FTlYyWyxpXSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA4LTAxLTAxKSwgZW5kID0gYygyMDEzLTAxLTAxKSkNCiAgZ3JhcGgudGltZTIyIDwtIHBsb3QoZ3JhcGgudGltZTIsIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiVmFsdWUiLCBtYWluID0gIkV4cGVjdGVkIHZhbHVlcyIsIHlsaW0gPSBjKG1pbihncmFwaC50aW1lMiksIG1heChncmFwaC50aW1lMikpKQ0KDQogIGF1dG8uYXJpbWEgPC0gYXV0by5hcmltYShncmFwaC50aW1lMikNCiAgZ3JhcGguYXV0by5hcmltYSA8LSBwbG90KGZvcmVjYXN0KGF1dG8uYXJpbWEsIGggPSAxMjApLCBtYWluID0gIkZvcmVjYXN0IChBUklNQSkiKQ0KICANCiAgZ3JhcGgubGFnIDwtIGFjZihncmFwaC50aW1lMiwgbmEuYWN0aW9uID0gbmEucGFzcywgeGxhYiA9ICJMYWcgKHllYXIpIiwgeWxhYiA9ICJBQ0YiLCBtYWluID0gIkF1dG9jb3JyZWxhdGlvbiBGdW5jdGlvbiIsIHlsaW0gPSBjKDAsIDEpKQ0KICANCiAgbXRleHQoY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSwgY2V4ID0gMS4yLCBvdXRlciA9IFRSVUUpDQp9DQoNCiNkYXRhc2V0LkVOVjJbZGF0YXNldC5FTlYyID09IDBdIDwtIE5BDQogDQojcm0oZGF0YXNldC5OQU0yKQ0KDQpgYGANCg0KQmVsb3cgYXJlIHRoZSByZXN1bHRzIG9mIHRoZSBManVuZy1Cb3ggc3RhdGlzdGljcyB0ZXN0IGFwcGxpZWQgdG8gZWFjaCB2YXJpYWJsZSB3aGljaCBjb25maXJtaW5nIHRoZSByZXN1bHRzIGlsbHVzdHJhdGVkIGJ5IHRoZSBhYm92ZSBncmFwaHMuIEEgdmFsdWUgb2YgUCAocC12YWx1ZSkgbGVzcyB0aGFuIDAuMDUgbWFrZXMgaXQgcG9zc2libGUgdG8gYXNzdW1lIHRoYXQgdGhlIHJlc2lkdWFsIHZhbHVlcyBvZiBhIHZhcmlhYmxlIGRlcGVuZCBvbiB0aGUgcGVyaW9kIG9mIHRoZSB5ZWFyICh0aW1lKS4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojVGVtcG9yYWwgSW5kw6lwZW5kZW5jZSBvZiBWYXJpYWJsZXMgKHBhcnQgSUkpDQoNCmRhdGFzZXQuRU5WMltpcy5uYShkYXRhc2V0LkVOVjIpXSA8LSAwDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS00KSl7DQogIGdyYXBoLnRpbWUyIDwtIHRzKGRhdGFzZXQuRU5WMlssaV0sIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNS0wMS0wMSksIGVuZCA9IGMoMjAxNi0wMS0wMSkpDQogIGF1dG8uYXJpbWEgPC0gYXV0by5hcmltYShncmFwaC50aW1lMikNCiAgYm94IDwtIGxhcHBseSgxOjIwLCBmdW5jdGlvbihqKSBCb3gudGVzdCAocmVzaWQoYXV0by5hcmltYSksIGxhZyA9IGosIHR5cGU9IkxqdW5nIikpDQogIHByaW50KHBhc3RlKGNvbG5hbWVzKGRhdGFzZXQuRU5WMltpXSkpKSAgDQogIHByaW50KGJveCkNCn0NCg0KZGF0YXNldC5FTlYyW2RhdGFzZXQuRU5WMiA9PSAwXSA8LSBOQQ0KDQoNCmBgYA0KDQoNCiMjUmVsZWFzZXMgTm90ZXMNCioqV2hhdCdzIE5ldywgVXBkYXRlZCwgb3IgRml4ZWQgaW4gVGhpcyBSZWxlYXNlKioNCg0KDQoqKioNCiFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX25ldy5wbmcpIE5ld8KgJm5ic3A7Jm5ic3A7Jm5ic3A7wqAgIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fdXBkYXRlZC5wbmcpIFVwZGF0ZWTCoCZuYnNwOyZuYnNwOyZuYnNwO8KgICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX2ZpeGVkLnBuZykgRml4ZWQNCg0KKioqDQoNCioqQ0FCSU5fdnZfaGFiaXRhdC5SbWQgVmVyc2lvbiAxLjEg4oCUIE5vdmVtYmVyIDFzdCwgMjAxNyoqDQoNCkFkZGVkIHN1Z2dlc3Rpb25zIG9mIGFjdGlvbnMgdG8gaGVscCBpbiB0aGUgdmVyaWZpY2F0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIGhhYml0YXQgZGF0YS4gDQoNCiFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX25ldy5wbmcpICAgKipBY3Rpb25zKiogLS0tIEFkZGVkIHN1Z2dlc3Rpb25zIG9mIGFjdGlvbnMgdG8gaGVscCBpbiB0aGUgdmVyaWZpY2F0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIGhhYml0YXQgZGF0YS4gDQoNCg0KKipDQUJJTl92dl9oYWJpdGF0LlJtZCBWZXJzaW9uIDEuMCDigJQgQXVndXN0IDE4LCAyMDE3KioNCg0KIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fbmV3LnBuZykgICAqKkZpcnN0IGNvbXBsZXRlZCB2ZXJzaW9uKiouDQoNCg0KKioqDQoNCkRldmVsb3BlZCBieSBbTWFydGluIEplYW5dKG1haWx0bzptYXJ0aW4uamVhbkBjYW5hZGEuY2EpIGFuZCBFdmVseW5lIFBhcXVldHRlLUJvaXNjbGFpcg==